#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char ** argv) {
	if (argc != 4) {
		printf("Niepoprawna liczba argumentów. Poprawne wywołanie: ./zad1.o <ciąg_znaków> <ścieżka_do_pliku> <ciąg_znaków>");
		return -1;
	}
	int fd1[2], fd2[2];
	pid_t pid, pid2;
	if (pipe(fd1) == -1) {
		perror("pipe");
		return -1;
	}
	pid = fork();
	if (pid == -1) {
		perror("fork");
		return -4;
	} else if (pid == 0) {
		if (pipe(fd2) == -1) {
			perror("pipe");
			return -2;
		}
		pid2 = fork();
		if (pid2 == -1) {
			perror("fork");
			return -3;
		} else if (pid2 == 0) {
			//wnuk
			close(fd1[1]);
			close(fd1[0]);
			close(fd2[1]);
			if (fd2[0] != STDIN_FILENO) {
				if (dup2(fd2[0], STDIN_FILENO) != STDIN_FILENO) {
					perror("dup2");
					return -8;
				}
			}
			close(fd2[0]);
			if (execlp("wc", "wc", "-l", NULL) < 0) {
				perror("execlp");
				return -10;
			}
		} else {
			//dziecko
			close(fd1[1]);
			if (fd1[0] != STDIN_FILENO) {
				if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO) {
					perror("dup2");
					return -7;
				}
			}
			close(fd1[0]);
			close(fd2[0]);
			if (fd2[1] != STDOUT_FILENO) {
				if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO) {
					perror("dup2");
					return -6;
				}
			}
			close(fd2[1]);
			if (execlp("grep", "grep", "-i", argv[3], NULL) < 0) {
				perror("execlp");
				return -9;
			}
		}
	} else {
		//macierzysty
		close(fd1[0]);
		if (fd1[1] != STDOUT_FILENO) {
			if (dup2(fd1[1], STDOUT_FILENO) != STDOUT_FILENO) {
				perror("dup2");
				return -5;
			}
			close(fd1[1]);
		}
		if (execlp("grep", "grep", argv[1], argv[2], NULL) < 0) {
			perror("execlp");
			return -9;
		}
	}
	return 0;
}
